﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using ABC.Domain.Entities;
using RosService.Data;

namespace ABC.Business.Models
{
    public class PartnerModel
    {
        private readonly RosModel rosModel;

        public PartnerModel(RosModel rosModel)
        {
            this.rosModel = rosModel;
        }
        public void UpdatePartner(string id, Dictionary<string, object> values, HttpPostedFileBase data, List<Office> offices, string[] deleteOfficesId)
        {
            foreach (var value in values)
            {
                rosModel.UpdateEntityValue(id, value.Key, value.Value);
            }
            if (data != null)
            {
                if (data.ContentLength > 0)
                {
                    SetAvatar(id, data);
                }
            }
            AddOfficesToPartner(offices, id);
            foreach (var officeId in deleteOfficesId)
            {
                rosModel.DeleteEntity(officeId);
            }
        }
        public string AddPartner(Dictionary<string, object> values, HttpPostedFileBase data, List<Office> offices)
        {
            var newId = rosModel.AddEntity("Партнеры", "Партнер", values).ToString();
            if (data != null)
            {
                if (data.ContentLength > 0)
                {
                    SetAvatar(newId, data);
                }
            }
            AddOfficesToPartner(offices, newId);
            return newId;
        }
        public void DeleteAvatar(string photoId, string userId)
        {
            rosModel.DeleteEntity(photoId, false);
            rosModel.UpdateEntityValue(userId, "СсылкаНаАватар", "");
        }

        public string SetAvatar(string userId, HttpPostedFileBase data)
        {
            var photoId = rosModel.SaveFile(userId, data);
            rosModel.UpdateEntityValue(userId, "СсылкаНаАватар", Convert.ToDecimal(photoId));
            return photoId.ToString();
        }
        public decimal GetPartnerAvatar(string userId)
        {
            return rosModel.GetEntityValue<decimal>(userId, "СсылкаНаАватар");
        }
        public TableValue GetPartnersForAdmin(Dictionary<string, object> filters, int numberOfOutputData = 0, int page = 0)
        {
            return rosModel.GetEntities("Партнер", "Партнеры", new Dictionary<string, Query.НаправлениеСортировки> { { "НазваниеОбъекта", Query.НаправлениеСортировки.Asc } }, null,
                                     new[]
                                         {
                                             "НазваниеОбъекта", "НомерТелефона", "ФаксДоб", "ТекстДляКнопки", "Вид","ФормаСобственности","Факс"
                                         }, numberOfOutputData, page);
        }
        public DataRow GetPartner(string partnerId)
        {
            return rosModel.GetEntityById("Партнер", partnerId, new[]
                                                                    {
                                                                        "Вид", "НазваниеОбъекта", "ГодОснования",
                                                                        "НомерТелефона","СсылкаНаАватар",
                                                                        "Факс", "ФаксДоб", "ВебСайт", "ЭлектроннаяПочта"
                                                                        , "СоцСеть",
                                                                        "ТипСоцСеть", "ПолноеНазваниеОбъекта",
                                                                        "ФормаСобственности",
                                                                        "НомерТелефонаРеквизиты", "ФаксРеквизиты",
                                                                        "ЮридическийАдрес",
                                                                        "ФактическийАдрес", "ИНН", "КПП", "ОКПО1",
                                                                        "РасчетныйСчет",
                                                                        "КорреспондентскийСчет", "БИК"
                                                                    });
        }
        public void AddOfficesToPartner(List<Office> offices, string partnerId)
        {
            var values = new Dictionary<string, object>();
            foreach (var office in offices)
            {
                values.Add("НазваниеОбъекта", office.Name);
                values.Add("Тип", office.Type);
                values.Add("НомерТелефона", office.Phone);
                values.Add("НомерТелефонаДоб", office.PhoneDob);
                values.Add("Факс", office.Fax);
                values.Add("ФаксДоб", office.FaxDob);
                values.Add("Email", office.Email);
                values.Add("ВебСайт", office.Website);
                values.Add("Адрес", office.Address);
                values.Add("ПонедельникНачало", office.MondayFrom);
                values.Add("ПонедельникОкончание", office.MondayTo);
                values.Add("ВторникНачало", office.TuesdayFrom);
                values.Add("ВторникОкончание", office.TuesdayTo);
                values.Add("СредаНачало", office.WednesdayFrom);
                values.Add("СредаОкончание", office.WednesdayTo);
                values.Add("ЧетвергНачало", office.ThursdayFrom);
                values.Add("ЧетвергОкончание", office.ThursdayTo);
                values.Add("ПятницаНачало", office.FridayFrom);
                values.Add("ПятницаОкончание", office.FridayTo);
                values.Add("СубботаНачало", office.SaturdayFrom);
                values.Add("СубботаОкончание", office.SaturdayTo);
                values.Add("ВоскресеньеНачало", office.SundayFrom);
                values.Add("ВоскресеньеОкончание", office.SundayTo);
                Decimal id;
                if (Decimal.TryParse(office.Id, out id))
                {
                    UpdateOffice(id.ToString(), values);
                }
                else
                {
                    rosModel.AddEntity(partnerId, "Офис", values);
                }
                values.Clear();
            }

        }
        public void UpdateOffice(string id, Dictionary<string, object> values)
        {
            foreach (var value in values)
            {
                rosModel.UpdateEntityValue(id, value.Key, value.Value);
            }
        }
        public TableValue GetPartnerOffices(string id, int numberOfOutputData = 0, int page = 0)
        {
            return
                rosModel.GetEntities("Офис", id, new Dictionary<string, Query.НаправлениеСортировки> { { "НазваниеОбъекта", Query.НаправлениеСортировки.Asc } }, null,
                                     new[]
                                         {
                                             "НазваниеОбъекта", "Тип", "НомерТелефона", "НомерТелефонаДоб", "Факс",
                                             "ФаксДоб", "Адрес"
                                         }, numberOfOutputData, page);/*.AsEnumerable().Select(
                                             x =>
                                             new EditOffice
                                             {
                                                 Id = x["id_node"].ToString(),
                                                 Address = x["Адрес"].ToString(),
                                                 Fax = x["Факс"].ToString(),
                                                 FaxDob = x["ФаксДоб"].ToString(),
                                                 Name = x["НазваниеОбъекта"].ToString(),
                                                 Phone = x["НомерТелефона"].ToString(),
                                                 PhoneDob = x["НомерТелефонаДоб"].ToString(),
                                                 Type = x["Тип"].ToString()
                                             }).ToList();*/
        }
        public Office GetOffice(string id)
        {
            var office = rosModel.GetEntityById("Офис", id, new[]
                                                                {
                                                                    "НазваниеОбъекта", "Тип", "НомерТелефона",
                                                                    "НомерТелефонаДоб", "Факс","ФаксДоб","Email",
                                                                    "ВебСайт","Адрес","ПонедельникНачало","ПонедельникОкончание",
                                                                    "ВторникНачало","ВторникОкончание","СредаНачало","СредаОкончание","ЧетвергНачало",
                                                                    "ЧетвергОкончание","ПятницаНачало","ПятницаОкончание","СубботаНачало","СубботаОкончание"
                                                                    ,"ВоскресеньеНачало", "ВоскресеньеОкончание"
                                                                });
            if (office != null)
            {
                var result = new Office
                                 {
                                     Address = office["Адрес"].ToString(),
                                     Name = office["НазваниеОбъекта"].ToString(),
                                     Id = office["id_node"].ToString(),
                                     Type = office["Тип"].ToString(),
                                     Email = office["Email"].ToString(),
                                     Fax = office["Факс"].ToString(),
                                     FaxDob = office["ФаксДоб"].ToString(),
                                     Phone = office["НомерТелефона"].ToString(),
                                     PhoneDob = office["НомерТелефонаДоб"].ToString(),
                                     Website = office["ВебСайт"].ToString(),
                                     MondayFrom = office["ПонедельникНачало"].ToString(),
                                     MondayTo = office["ПонедельникОкончание"].ToString(),
                                     TuesdayFrom = office["ВторникНачало"].ToString(),
                                     TuesdayTo = office["ВторникОкончание"].ToString(),
                                     WednesdayFrom = office["СредаНачало"].ToString(),
                                     WednesdayTo = office["СредаОкончание"].ToString(),
                                     ThursdayFrom = office["ЧетвергНачало"].ToString(),
                                     ThursdayTo = office["ЧетвергОкончание"].ToString(),
                                     FridayFrom = office["ПятницаНачало"].ToString(),
                                     FridayTo = office["ПятницаОкончание"].ToString(),
                                     SaturdayFrom = office["СубботаНачало"].ToString(),
                                     SaturdayTo = office["СубботаОкончание"].ToString(),
                                     SundayFrom = office["ВоскресеньеНачало"].ToString(),
                                     SundayTo = office["ВоскресеньеОкончание"].ToString(),

                                 };
                return result;
            }
            return new Office();
        }
        public Dictionary<string, string> GetPartners()
        {
            return
                rosModel.GetEntities(
                    "[Типы=Партнер;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc)];Места=(Партнеры,1)]", new Dictionary<string, object>()).ToDictionary(
                        company => company["id_node"].ToString(),
                        company => company["НазваниеОбъекта"].ToString());
        }

        public List<TrashItem> GetDeletePartners(string query)
        {
            var filters = new Dictionary<string, object> { { "Удален", true } };
            if (!string.IsNullOrEmpty(query))
            {
                filters.Add("НазваниеОбъекта", query);
            }
            DateTime date;
            return
                rosModel.GetEntities(
                    "[Типы=Партнер;Колонки=(НазваниеОбъекта,ДатаУдаленияОбъекта,ДатаСозданияОбъекта);Сортировки=(НазваниеОбъекта,Asc)];Места=(Партнеры,1)]", filters).Select(x => new TrashItem
                    {
                        Id = x["id_node"].ToString(),
                        DateCreate = DateTime.Parse(x["ДатаСозданияОбъекта"].ToString()),
                        DateDelete = DateTime.TryParse(x["ДатаУдаленияОбъекта"].ToString(), out date) ? date.ToString("dd MMMM yyyy HH:mm") : string.Empty,
                        Type = x["type"].ToString(),
                        Name = x["Названиеобъекта"].ToString()
                    }).ToList();
        }

        public Dictionary<string, string> GetTypesOfInsurance()
        {
            return
                rosModel.GetEntities(
                    "[Типы=ЭлементСправочника;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc);Места=(ВидыСтрахования,1)]", new Dictionary<string, object>()).ToDictionary(
                        company => company["id_node"].ToString(),
                        company => company["НазваниеОбъекта"].ToString());
        }

        public string AddProduct(string partnerId, Dictionary<string, object> values)
        {
            var newId = rosModel.AddEntity(partnerId, "Продукт", values).ToString();
            return newId;
        }

        public TableValue GetProductsOfPartner(string id, int numberOfOutputData = 0, int page = 0)
        {

            return rosModel.GetTableEntities(
                    "[Типы=Продукт;Колонки=(НазваниеОбъекта,Тип);Сортировки=(НазваниеОбъекта,Asc);Места=(" + id + ",1)]", numberOfOutputData, page);

        }
        public DataRow GetProduct(string id)
        {
            return
                rosModel.GetEntityById("Продукт", id, new[] { "НазваниеОбъекта", "Тип", "ВАрхиве", "СсылкаНаОписание", "Описание", "@РодительскийРаздел" });

        }

        public void UpdateProduct(string id, Dictionary<string, object> values)
        {
            foreach (var value in values)
            {
                rosModel.UpdateEntityValue(id, value.Key, value.Value);
            }
        }
        public void DeletePartner(string partnerId)
        {
            rosModel.UpdateEntityValue(partnerId, "Удален", true);
            rosModel.UpdateEntityValue(partnerId, "ДатаУдаленияОбъекта", DateTime.Now);
        }
        public void ForeverDeletePartners(string userId)
        {
            var filters = new Dictionary<string, object> { { "Удален", true } };
            var deletedPartners = rosModel.GetEntities(
                "[Типы=Партнер;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc)];Места=(Партнеры,1)]", filters);
            foreach (var partner in deletedPartners)
            {
                rosModel.DeleteEntity(partner["id_node"].ToString());
            }
        }
    }
}